package com.bq.server.base;

import javax.annotation.Nonnull;
import java.text.MessageFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 缓存key
 *
 * @author: ChenSH
 * @date: Create by in 15:24 2019-09-19
 */
public interface CacheKey {

    /**
     * 分隔符号
     */
    String SEPARATOR = ":";

    /**
     * 缓存key前缀
     */
    @Nonnull
    String getPrefix();

    /**
     * 获取key
     * <p>
     * 可以包含占位符,请使用{@link #key(Object...) }方法获取完整key值
     * 如:mer:{0}:users:{1} ,0和1位参数下标
     *
     * @see #key(Object...)
     */
    @Nonnull
    String getKey();

    /**
     * 获取完整key值
     *
     * @param args {@link #getKey()} 返回值的占位符
     * @return 完整key值
     * @see MessageFormat#format(String, Object...)
     */

    default String key(Object... args) {
        return MessageFormat.format(getPrefix() + getKey(), args);
    }


    /**
     * 获取key
     *
     * @param args 后缀参数
     * @return key
     * @deprecated {@link #key(Object...)}
     */
    @Deprecated
    default String getKey(Object... args) {
        return String.join(
                SEPARATOR, getPrefix(), getKey(),
                Stream.of(args)
                        .map(String::valueOf)
                        .collect(Collectors.joining(SEPARATOR))
        );

    }


    /**
     * 过期剩余时间
     * null 代表永不过期
     */
    Duration getExpire();

    /**
     * 指定时间点过期
     *
     * @deprecated {@link #expireAt()}
     */
    @Deprecated
    default Date getExpireAt() {
        Duration expire = getExpire();
        if (Objects.isNull(expire)) {
            return null;
        }
        return new Date(System.currentTimeMillis() + expire.toMillis());
    }

    /**
     * 指定时间点过期
     */
    default LocalDateTime expireAt() {
        Duration expire = getExpire();
        if (Objects.isNull(expire)) {
            return null;
        }
        return LocalDateTime.now().plus(expire);
    }


}
